<?php
/*
数据库操作类
author:jackbrown
version: 3.0.3
time: 2011-8-10
需定义常量
SERVER服务器名
DBUSER 登录用户名
DBPWD 登录密码
DBNAME 选择的数据库
DB_CHARSET 使用的数据字符集
*/
if(!defined('IN_WEB')){
	exit('Access Deny!');
}

class dataBase{
	
	private static $con;//数据连接
	
	/*所有表*/
	protected static $tables = array();
	
	public $execSQL = '';
	
	public function __construct($pconnect=false){
		
		if(mysql_ping(self::$con)){			
			return false;
		}
		
		if(DEBUG){
			$start = run_time();
		}
		
		if(!$pconnect){
			self::$con=@mysql_connect(SERVER,DBUSER,DBPWD);
		}else{
			self::$con=@mysql_pconnect(SERVER,DBUSER,DBPWD);
		}
		

		
		if(self::$con){
			$this->db=@mysql_select_db(DBNAME,self::$con);

			if(!$this->db){
				exit(mysql_errno."-你选择的数据库不存在!");
			}
			
			if(DEBUG){
				$end = run_time();
				$GLOBALS['debugStr'][] = '连接到数据库'.DBUSER.'@'.SERVER.'... ok('.(($end - $start)*1000). ')';
				$GLOBALS['sql_time'] += ($end - $start)*1000;
				
			}
		}else{
			exit(mysql_errno."-无法连接服务器，请检查你的连接的服务器是否存在，或你的登录用户名和密码是否正确!");
		}
	}
	
	/**
	*查询命令
	**/
	public function query($sql){
		if(empty($sql) || $sql==''){
			return false;
		}
		mysql_query('SET NAMES '.DB_CHARSET);
		
		if(DEBUG){
			$start = run_time();
		}
		
		$this->execSQL = $sql;
		if($result=@mysql_query($sql,self::$con)){
			
			if(DEBUG){
				$end = run_time();
				$spend = ' <font color="green">(时间:'.(($end - $start)*1000).' ms)</font>';
				global $debugStr;
				$debugStr[] = $sql. $spend;
				$GLOBALS['sql_time'] += ($end - $start)*1000;
			}
			return $result;

		}else{
			
			global $addr;
			$db_err = '<p><strong>sql</strong>: <em>'.$sql.'</em>; 
			<br /><strong>time</strong>:'.date('Y-m-d H:i:s').';
			<br /> <strong>page</strong>: '.$addr['basename'].';
			<br /> <strong>Line</strong>: '.__LINE__.';
			<br /><strong>error</strong>: <font color=red>'.mysql_errno().';'.mysql_error().";</font>sql查询语句错误!</p>\n";	
			
			if(class_exists('error') && is_object($GLOBALS['error']) ){
				$GLOBALS['error']->showErrorStr($db_err,'javascript:',false);
			}else{				
				if(DEBUG){
					exit($db_err);
				}
			}
			
			return false;
		}
	}
	
	/**
	* 
	*记录总数
	*$source需为query的查询指针
	*/
	public function recordCount($sql){
			$result=$this->query($sql);
			return mysql_num_rows($result);
	}
	
	/**
	 * 获取记录的总数
	 *
	 * @param string $sql 里需有一个别名resum
	 * @return 返回记录总数
	 */
	public function recordSum($sql){
		
		$res = $this->getResultArray($sql,true);
		return $res['resum'];
	}
		
	/**
	*获取指定查询语句的数组
	*@param string $sql 查询语句
	*@param  boolean $single 是否只反回一条
	*@return array查询结果数组
	*/
	function getResArray($sql,$single=false,$callBack=''){
			
			$result=$this->query($sql);
			if(!$result){
				return false;	
			}
			$result_array=array();
			while($res=@mysql_fetch_assoc($result)){
				if(function_exists($callBack)){
					array_push($result_array,$callBack($res));
				}else{
					array_push($result_array,$res);
				}
			}
			
			mysql_free_result($result);
			if($single==false){
				return $result_array;
			}else{
				return $result_array[0];
			}
	}
	

	/**
	 * 获取一个查询结果所有数字字段的和
	 * @param string $sql sql语句
	 * @return array;
	 */
	public function getResSumArr($sql){
	
			$result=$this->query($sql);
			if(!$result){
				return false;	
			}
			
			$resArray = array();
			while($res=@mysql_fetch_assoc($result)){
				foreach($res as $fld=>$val){
					if(is_numeric($val)){
						$resArray[$fld]+=$val;
					}
				}
			}
			
			return $resArray;
					
	}
	
	/**
	 * 获取一个数组
	 */
	public function getResOneArr($sql,$keyItem,$valItem){
			
			$result=$this->query($sql);
			if(!$result){
				return false;	
			}
			
			$result_array=array();
			while($res=@mysql_fetch_assoc($result)){
				if(is_array($valItem)){
					$temp  = array();
					foreach($valItem as $k=>$item){
						$temp[$item] = $res[$item];
						unset($res[$item]);
					}	
						
					if($result_array == null){		
						$result_array = $res;	
					}
								
					$result_array[$keyItem][] = $temp;
					
				}else{
					$result_array[$res[$keyItem]] = $res[$valItem];
				}
			}
			
			mysql_free_result($result);
			return $result_array;
	}
	
	public function getResultArray($sql,$single=false){return $this->getResArray($sql,$single);}
	
	/**
	*查询一个表的相关数据
	*/
	public function getRecords($table_name,$fields='*',$order='',$where='',$limit='all',$locked=false){

		if(is_array($fields) && $fields!=null){
			foreach($fields as $item){
				$fld.='`'.$item.'`,';
			}
			$fld=substr($fld,0,strlen($fld)-1);
		}else{
			$fld=$fields=='' ? '*' : $fields;
		}
		
		if(is_array($table_name) && $table_name!=null){
			
			foreach($table_name as $key=>$table){
				
				$tableList.="`$table` as $key,";
			}
			
			$tableList =substr($tableList,0,-1);
		}else{
			
			$tableList = $table_name;
		}
	
			$where=$where!='' ? 'where '.$where : '';
			$limit=$limit==0 || $limit=='' || $limit=='all' ? '': 'limit '.intval($limit);
			$order = $order!='' ? "order by $order" : '';
			if($locked){
				$lockRow = " for update";	
			}
			
			$sql="select $fld from $tableList $where $order $limit $lockRow";

			return $this->getResArray($sql);
	}
	
	/**
	*插入数据
	*@param string $table_name 表名
	*@param array $item 数据数组,'字段'=>'值'
	*@return true / false;
	*/
	public function insert($table_name,$item){
			
			if($item == null || !is_array($item)){
			
				return false;
			}
			
			$fields = array_keys($item);
			$values = array_values($item);
			
			if(is_array($fields) ){
				
				foreach($fields as $item){
					$fld.="`$item`".',';
				}
				$fld=substr($fld,0,strlen($fld)-1);
				
			}else{
				
				$fld=$fields;
			}
			
			if(is_array($values) ){
				foreach($values as $item){
					
					$item = addslashes($item);
					$val.="'$item',";
					
				}
				$val=substr($val,0,strlen($val)-1);

			}else{
				$val=$values;
			}
		     
			$sql="insert into $table_name($fld) values($val)";
			return $this->query($sql);			
	}
	public function insertRecordEx($table_name,$item){return $this->insert($table_name,$item);}
	
	
	/**
	*更新数据
	*@param string $table_name 数据表名
	*@param array 更新数据项 '字段'=>'值'
	*@param $where 条件
	*@return true/false;
	*/
	public function update($table_name,$item,$where){
		
		foreach($item as $key=>$value){
				
				$value = addslashes($value);
				$update.="`$key`='$value',";
		}

		$update=substr($update,0,strlen($update)-1);
		$where=!empty($where) ? 'where '.$where : '';
		$sql="update $table_name set $update $where";
		return $this->query($sql);
	}
	public function updateRecord($table_name,$item,$where){return $this->update($table_name,$item,$where);}
	
	/**
	*通过id删除数据
	*@param string $table_name 数据表名
	*@param int $id 数据的id值
	*@return true/false
	*/
	public function delById($table,$id){
		if(intval($id)<=0 ){
			echo '错误的id号';
			return;
		}
		
		$sql="delete from `$table` where id=$id";
		$res = $this->query($sql);
		$this->opTable($table);
		
		return $res;
		
	}
	public function deleteRecordEx($table_name,$where){return $this->deleteRecord($table_name,$where);}
	
	/**
	*通过复杂条件删除数据
	*@param string $table_name 数据表名
	*@param string $where 条件
	*@return true/false
	*/	
	public function deleteRecord($table,$where){
		if($where=='') return;
		
		$sql="delete from `$table` where $where";
		$res = $this->query($sql);
		$this->opTable($table);
		
		return $res;

	}
	
	
	/**
	*检查表是否存在
	*@param stirng $table表名
	*@return true/false;
	*/
	public function existsTable($table){
			
		return in_array($table,$this->getTables());
		
	}
	
	public function getTableInfo($table){
		return $this->getResArray("show table status like '$table'",true);
	}
	
	/**
	*影响行数
	*/
	function affectRows(){
		return mysql_affected_rows();	
	}
	
	
	/**
	*开始一个事务,用于事务处理
	*/
	public function start(){
		
		return $this->query('set autocommit = 0') && $this->query('start transaction');	
	}
	
	
	
	/**
	*提交事务中的数据
	*/
	public function commit(){
		
		return $this->query('commit');	
	}
	
	/**
	*回滚事务
	*/
	public function rollBack(){
		
		return $this->query('rollback');
	}
	
	/**
	 * 获取最后插入ID
	 * 比mysql_insert_id安全
	 * @return int
	 */
	public function lastInsertID(){
	
		$res = $this->getResArray('select last_insert_id() as id',true);
		return $res['id'];
		
	}
	
	/**
	*优化表
	*/
	public function opTable($table){
		
		$status = $this->query('optimize table '.$table);
		return $status;
	}
	
	/**
	*导出数据
	*@param string $table 要导出的表
	*@return string 可执行的sql语句
	*/
	public function dumpData($table='',$file=''){
		
		if($table != ''){
			
			return $this->getTableSql($table);
			
		}else{
			
			$tables	= $this->getTables();
			
			if($tables!=null){
				
				$outSql = '';
				foreach($tables as $key=>$table){
					
					$outSql.= $this->getTableSql($table);
					
				}
				
				return $outSql;
			}
			
		}	
		
		
	}
	
	/**
	*转换数据库
	*@param string $dbName 数据库名称
	*/
	public function useDataBase($dbName){
		
		return $this->query('use '.$dbName);	
	}
	
	
	/**
	*复制一个查询的数据到另一个表
	*@param string $table 目标数据表的名称
	*@param string $sql 可执行的sql语句
	*/
	public function copyFromSQL($table,$sql){
		
		if($this->existsTable($table)){
			
			return $this->query("insert into  $table $sql");
			
		}else{
			return $this->query("create table $table $sql");
		}
	}
	
	/**
	*从sql文件中导入数据
	*@param string $file sql文件路径
	*/
	public function import($file){
			

		if(!file_exists($file)){
			echo('找不到sql文件'.$file);	
			return false;
		}
		$sql = file_get_contents($file);
		$sql = preg_replace('/{pre}/',PRE,$sql);
		$sql = iconv('gb2312',SYS_CHARSET,$sql);	
		$sqlArr = explode(';',$sql);
		$res = true;
		
		if($sqlArr != null){
				
			foreach($sqlArr as $tsql){
				
				if($tsql != ''){
					$res = $res && $this->query($tsql);
				}
			}
		}
		
		return $res;
	}
	
	/**
	*获取表的可执行sql;
	*@param string $table -表名
	*@return string sql语句
	*/
	protected function getTableSql($table){
		
			$structStr = $this->getResArray("show create table $table",true);
			$structStr = $structStr['Create Table'];
			$fields = $this->getTableFields($table);
			
			foreach($fields as $key=>$fld){
					
				$fldStr .= "`$fld`,";
			}
			
			$fldStr   = substr($fldStr,0,-1);			
			$dataStr  = '';			
			$dataLink = $this->query("select*from $table");
			
			while($res=@mysql_fetch_array($dataLink)){
				
				$eachData = '';
				foreach($res as $key=>$value){
					
					if(is_numeric($key)){
						$eachData .= "'".addslashes($value)."',";
					}
				}
				
				$eachData = substr($eachData,0,-1);
				$dataStr.="insert into $table($fldStr) values($eachData);\n";
			}
			mysql_free_result($dataLink);
			return $structStr.";\n".$dataStr;		
		
	}
	
	/**
	*获取表的列表
	*@return 表的数组;
	*/
	protected function getTables(){
		
		if(self::$tables!=null){
			return self::$tables;
		}
		
		$result=$this->query('show tables');
		if(!$result){
			return false;
		}

		$tables =  array();
		while($res=@mysql_fetch_array($result)){
			
			$tables[] = $res[0];

		}
		
		self::$tables = $tables;
		mysql_free_result($result);
		return $tables;
	}
	
	
	/**
	 * 获取表的字段
	 * @param string $table 表名
	 * @return array
	 */
	public function getTableFields($table){
		
		$result=$this->query("describe $table");
		if(!$result){
			return false;
		}
		$fields =  array();
		while($res=@mysql_fetch_array($result)){
			
			$fields[] = $res[0];

		}
		mysql_free_result($result);
		return $fields;		
		
	}
	
}

?>